package presentacion;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Collections;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

import presentacion.vo.ErroresEtapa;
import presentacion.vo.ReporteVO;
import presentacion.vo.TareaVO;
import controlador.ControladorTSP;
import controlador.GeneradorReporte;


/**
* This code was edited or generated using CloudGarden's Jigloo
* SWT/Swing GUI Builder, which is free for non-commercial
* use. If Jigloo is being used commercially (ie, by a corporation,
* company or business for any purpose whatever) then you
* should purchase a license for each developer using Jigloo.
* Please visit www.cloudgarden.com for details.
* Use of Jigloo implies acceptance of these licensing terms.
* A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR
* THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED
* LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE.
*/
/**
 * @author Paul
 *
 */
public class ReporteProyectoFrame extends JInternalFrame {


	private static final long serialVersionUID = 8213722739436043045L;
	private JTextField textErroresReales;
	private JTable tableErroresXEtapa;
	private JTable tableTareas;
	private JScrollPane jScrollPane1;
	private JScrollPane jScrollPane2;
	private JButton buttonActualizar;
	private JButton buttonCerrar;
	private JPanel panelTareas;
	private JPanel panelErroresXEtapa;
	private JPanel jPanel1;
	private JTextField textTiempoReal;
	private JLabel labelTiempoReal;
	private JTextField textTiempoEstimado;
	private JLabel labelTiempoEstimado;
	private JTextField textLOCReales;
	private JTextField textLOCEstimadas;
	private JLabel labelLocReales;
	private JLabel labelLocEstimadas;
	private JLabel labelErroresReales;

	{
		//Set Look & Feel
		try {
			javax.swing.UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
		} catch(Exception e) {
			e.printStackTrace();
		}
	}

	/**
	* Auto-generated main method to display this JFrame
	*/
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				ReporteProyectoFrame inst = new ReporteProyectoFrame();
				//inst.setLocationRelativeTo(null);
				inst.setVisible(true);
			}
		});
	}
	
//	@LogsT(value={
//	@LogT(ciclo=2, id = 999, idUsuario = PAUL, tiempo= 999)
//})
// Tiempo empleado:  inicio 18:00 tiempo fin 18:37
	public ReporteProyectoFrame() {
		super();
		initGUI();		
		this.customInit();
	}
	
	/**
	 * Inicializa todas las propiedades graficas.
	 */
	private void initGUI() {
		try {
			setLayout(null);
			setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
			this.setTitle("Reporte Proyecto");
			this.setName("frameReporteProyecto");

			{
				jPanel1 = new JPanel();
				getContentPane().add(jPanel1);
				jPanel1.setLayout(null);
				jPanel1.setBounds(25, 22, 659, 163);
				jPanel1.setBorder(BorderFactory.createTitledBorder(null, "Reporte", TitledBorder.LEADING, TitledBorder.ABOVE_TOP));
				{
					labelErroresReales = new JLabel();
					jPanel1.add(labelErroresReales);
					labelErroresReales.setText("Errores Reales:");
					labelErroresReales.setBounds(20, 42, 107, 16);
				}
				{
					textErroresReales = new JTextField();
					jPanel1.add(textErroresReales);
					textErroresReales.setBounds(139, 36, 124, 28);
				}
				{
					labelLocEstimadas = new JLabel();
					jPanel1.add(labelLocEstimadas);
					labelLocEstimadas.setText("LOC Estimadas:");
					labelLocEstimadas.setBounds(20, 75, 107, 16);
				}
				{
					textLOCEstimadas = new JTextField();
					jPanel1.add(textLOCEstimadas);
					textLOCEstimadas.setBounds(139, 70, 124, 28);
				}
				{
					textLOCReales = new JTextField();
					jPanel1.add(textLOCReales);
					textLOCReales.setBounds(139, 104, 124, 28);
				}
				{
					labelLocReales = new JLabel();
					jPanel1.add(labelLocReales);
					labelLocReales.setText("LOC Reales:");
					labelLocReales.setBounds(20, 110, 107, 16);
				}
				{
					labelTiempoEstimado = new JLabel();
					jPanel1.add(labelTiempoEstimado);
					labelTiempoEstimado.setText("Tiempo Estimado:");
					labelTiempoEstimado.setBounds(296, 42, 101, 16);
				}
				{
					textTiempoEstimado = new JTextField();
					jPanel1.add(textTiempoEstimado);
					textTiempoEstimado.setBounds(417, 36, 106, 28);
				}
				{
					labelTiempoReal = new JLabel();
					jPanel1.add(labelTiempoReal);
					labelTiempoReal.setText("Tiempo Real:");
					labelTiempoReal.setBounds(296, 76, 74, 16);
				}
				{
					textTiempoReal = new JTextField();
					jPanel1.add(textTiempoReal);
					textTiempoReal.setBounds(417, 70, 106, 28);
				}
			}
			{
				panelErroresXEtapa = new JPanel();
				getContentPane().add(panelErroresXEtapa);
				panelErroresXEtapa.setBounds(408, 197, 276, 165);
				panelErroresXEtapa.setBorder(BorderFactory.createTitledBorder("Errores Por Etapa"));

				{
					jScrollPane2 = new JScrollPane();
					panelErroresXEtapa.add(jScrollPane2);
					jScrollPane2.setPreferredSize(new java.awt.Dimension(237, 113));
					{
						TableModel tableErroresXEtapaModel = 
							new DefaultTableModel(
									new String[][] { { "Etapa", "Errores" }, { "Three", "Four" } },
									new String[] { "Etapa", "Errores" });
						tableErroresXEtapa = new JTable();
						jScrollPane2.setViewportView(tableErroresXEtapa);
						tableErroresXEtapa.setModel(tableErroresXEtapaModel);
						tableErroresXEtapa.setBounds(320, 222, 193, 86);
						tableErroresXEtapa.setPreferredSize(new java.awt.Dimension(231, 55));
						tableErroresXEtapa.setBorder(new LineBorder(new java.awt.Color(0,0,0), 1, false));
					}
				}
			}
			{
				panelTareas = new JPanel();
				getContentPane().add(panelTareas);
				panelTareas.setBounds(25, 197, 353, 165);
				panelTareas.setBorder(BorderFactory.createTitledBorder("Tareas"));
				{
					jScrollPane1 = new JScrollPane();
					panelTareas.add(jScrollPane1);
					jScrollPane1.setBounds(108, 52, 231, 300);
					jScrollPane1.setPreferredSize(new java.awt.Dimension(313, 114));
					{
						TableModel tableTareasModel = 
							new DefaultTableModel(
									new String[][] { { "Tarea", "Planeado", "Real" }, { "Three", "Four", "Five" } },
									new String[] { "Tarea", "Planeado", "Real"});
						
						tableTareas = new JTable();
						jScrollPane1.setViewportView(tableTareas);
						tableTareas.setModel(tableTareasModel);
						tableTareas.setBorder(new LineBorder(new java.awt.Color(0,0,0), 1, false));
						tableTareas.setDoubleBuffered(true);
						tableTareas.setPreferredSize(new java.awt.Dimension(292, 60));
					}
				}
			}
			{
				buttonCerrar = new JButton();
				getContentPane().add(buttonCerrar);
				buttonCerrar.setText("Cerrar");
				buttonCerrar.setBounds(525, 374, 63, 28);
				buttonCerrar.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent evt) {
										
						cancelarAction();
						
					}
				});
			}
			{
				buttonActualizar = new JButton();
				getContentPane().add(buttonActualizar);
				buttonActualizar.setText("Actualizar");
				buttonActualizar.setBounds(440, 374, 80, 28);
				buttonActualizar.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent evt) {
						actualizarAction();
					}
				});
			}
			pack();
			this.setSize(726, 446);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public JTextField getTextErroresReales() {
		return textErroresReales;
	}
	
	public JTextField getTextLOCEstimadas() {
		return textLOCEstimadas;
	}
	
	public JTextField getTextLOCReales() {
		return textLOCReales;
	}
	
	public JTextField getTextTiempoEstimado() {
		return textTiempoEstimado;
	}
	
	public JTextField getTextTiempoReal() {
		return textTiempoReal;
	}
	
	public JTable getTableErroresXEtapa() {
		return tableErroresXEtapa;
	}
	
	public JTable getTableTareas() {
		return tableTareas;
	}
	
	public ControladorTSP getControladorTSP() {
		return controladorTSP;
	}
	
	public void setControladorTSP(ControladorTSP controladorTSP) {
		this.controladorTSP = controladorTSP;
	}
	
	public void setReporteVO(ReporteVO reporteVO) {
		this.reporteVO = reporteVO;
	}
	
	public ReporteVO getReporteVO() {
		return reporteVO;
	}

	// PROPIEDADES
	

	/**
	 * Controlador TSP
	 */
	private ControladorTSP controladorTSP;

	/**
	 * Informacion a mostrar en el reporte.
	 */
	private ReporteVO reporteVO;
	
	// METODOS PROPIOS
	
	/**
	 * Inicializacion de la clase.
	 */
	public void customInit(){
		this.setReporteVO(new ReporteVO());		
		this.cargarProyecto();
		this.mostrarReporteGeneral();
	}
	
	
	/**
	 * Metodo llamado al pulsar el boton cancelar.
	 */
	public void cancelarAction(){
		this.dispose();
	}
		
	
	/**
	 * Constructor con parametros.
	 * @param controladorTSP Instancia de controlador TSP
	 */
	public ReporteProyectoFrame(ControladorTSP controladorTSP) {
		super();
		initGUI();
		this.setControladorTSP(controladorTSP);		
		this.customInit();
	}
	
	/**
	 * Metodo que es llamado al presionar el boton actualizar.
	 */
	private void actualizarAction(){
		GeneradorReporte generador = this.getControladorTSP().getGeneradorReporte();
		this.reporteVO = generador.generarReporte();
		this.mostrarReporteGeneral();
	}
	
	
	/**
	 * Muestra la informacion del reporte general.
	 */
	public void mostrarReporteGeneral()
	{
//		ReporteVO reporteVODummy = new ReporteVO();
//		reporteVODummy.setErroresReales(34);
//		reporteVODummy.setLocsEstimados(2933);
//		reporteVODummy.setLocsReales(3000);
//		reporteVODummy.setTiempoEstimado(400);
//		reporteVODummy.setTiempoReal(78);
//		
//		List<ErroresEtapa> erroresEtapa = new ArrayList<ErroresEtapa>();				
//		ErroresEtapa e1 = new ErroresEtapa();
//		e1.setEtapa(EtapaPlan.CODIFICACION);
//		e1.setNumErrores(20);
//		
//		ErroresEtapa e2 = new ErroresEtapa();
//		e2.setEtapa(EtapaPlan.DISENO);
//		e2.setNumErrores(40);
//		
//		ErroresEtapa e3 = new ErroresEtapa();
//		e3.setEtapa(EtapaPlan.POSTMORTEM);
//		e3.setNumErrores(89);
//		
//		erroresEtapa.add(e1);
//		erroresEtapa.add(e2);
//		erroresEtapa.add(e3);		
//		reporteVODummy.setErroresEtapa(erroresEtapa);
//		
//	
//		List<TareaVO> tareasdumm = new ArrayList<TareaVO>();
//		
//		TareaVO t1 = new TareaVO();
//		t1.setTarea("Tarea 1");
//		t1.setTiempoPlaneado(10);
//		t1.setTiempoReal(35);
//		
//		tareasdumm.add(t1);
//		
//		reporteVODummy.setTareasBO(tareasdumm);	
//		this.setReporteVO(reporteVODummy);
		
				
		this.getTextErroresReales().setText(String.valueOf(reporteVO.getErroresReales()));
		this.getTextLOCEstimadas().setText(String.valueOf(reporteVO.getLocsEstimados()));
		this.getTextLOCReales().setText(String.valueOf(reporteVO.getLocsReales()));
		this.getTextTiempoEstimado().setText(String.valueOf(reporteVO.getTiempoEstimado()));
		this.getTextTiempoReal().setText(String.valueOf(reporteVO.getTiempoReal()));
		
		List<ErroresEtapa> erroresXEtapa = reporteVO.getErroresEtapa();		
		if(erroresXEtapa == null){
			erroresXEtapa = Collections.emptyList();
		}
		
		Object[][] dataErroresXEtapa = new Object[erroresXEtapa.size()][2];
		
		int size = erroresXEtapa.size();
		
		for (int i = 0; i < size; i++) {
			ErroresEtapa e = erroresXEtapa.get(i);			
			dataErroresXEtapa[i][0] = e.getEtapa();
			dataErroresXEtapa[i][1] = e.getNumErrores();			
		}

		DefaultTableModel tm = new DefaultTableModel(dataErroresXEtapa, getErroresXEtapaTableHeader());
		getTableErroresXEtapa().setModel(tm);
		getTableErroresXEtapa().setFillsViewportHeight(true);
		
		
		List<TareaVO> tareas = reporteVO.getTareasBO();
		if(tareas == null){
			tareas = Collections.emptyList();
		}
		
		Object[][] dataTareas = new Object[tareas.size()][3];
		
		
		size = tareas.size();
		
		for (int i = 0; i < size; i++) {
			TareaVO t = tareas.get(i);			
			dataTareas[i][0] = t.getTarea();
			dataTareas[i][1] = t.getTiempoPlaneado();		
			dataTareas[i][2] = t.getTiempoReal();
		}

		DefaultTableModel tm2 = new DefaultTableModel(dataTareas, getTareasTableHeader());
		getTableTareas().setModel(tm2);
		getTableTareas().setFillsViewportHeight(true);
		

	}
	
	/**
	 * Obtiene los encabezados para la tabla de errores 
	 * por etapa
	 * @return Array de Strings con los encabezados
	 */
	private String[] getErroresXEtapaTableHeader(){
		return new String[]{"Etapa","Errores"};
	}
	
	/**
	 * Obtiene los encabezados para la tabla de tareas 
	 * @return Array de Strings con los encabezados.
	 */
	private String[] getTareasTableHeader(){
		return new String[]{"Tarea","Estimado","Real"};
	}
	
	/**
	 * Carga la informacion del proyecto necesaria.
	 */
	// LOGINT  PAUL
	// COMIDA 
	// TIeMPO INICIAL 18:43
	// Tiempo final 18:48
	public void cargarProyecto(){	
		
		LeerProyectoFrame leerProyectoFrame = new LeerProyectoFrame(this.getControladorTSP());
		leerProyectoFrame.setVisible(true);		
		leerProyectoFrame.setLocationRelativeTo(this);
    	//this.add(leerProyectoFrame);		
	}
	
}
